package edu.zueb.sport.enums;

import com.google.common.collect.Lists;
import edu.zueb.sport.rest.api.MenuMeta;
import java.util.List;
import lombok.Getter;

/**
 * 菜单枚举类，用于定义系统中的所有菜单项及其相关属性。
 * 每个菜单项包含以下信息：
 * - 唯一标识符 (menuId)
 * - 父菜单标识符 (parentId)
 * - 路由路径 (path)
 * - 关联的组件 (component)
 * - 重定向路径 (redirect)
 * - 菜单名称 (name)
 * - 元数据 (meta)，包括图标、标题等
 * - 允许访问的用户类型列表 (userTypeEnums)
 *
 * 该类还提供了以下功能：
 * - 检查指定用户类型是否允许访问某个菜单项
 * - 根据用户类型获取允许访问的菜单项列表
 */
@Getter
public enum MenuEnum {

    /**
     * 器材管理主菜单
     * - 顶级菜单项（parentId=0）
     * - 路由路径：/equipment
     * - 基础布局组件：Layout
     * - 重定向配置：自动跳转至器材类别管理子菜单（/equipment/equipmentType）
     * - 功能说明：器材相关功能的主入口菜单
     * - 权限控制：教师与学生均可访问
     */
    EQUIPMENT(
            "200",
            "0",
            "/equipment",
            "#",
            "/equipment/equipmentList",
            "Equipment",
            new MenuMeta("router.equipment", "vi-bx:bxs-component", null),
            Lists.newArrayList(UserTypeEnum.TEACHER, UserTypeEnum.STUDENT)),

    /**
     * 器材类别管理菜单项
     * - 父菜单：器材管理（menuId=200）
     * - 路由路径：/equipmentTypeManagement
     * - 组件布局：Layout
     * - 权限范围：仅教师可见
     */
    EQUIPMENT_TYPE_MANAGEMENT(
            "201",
            "200",
            "equipmentTypeManagement",
            "views/Equipment/EquipmentTypeManagement",
            null,
            "EquipmentTypeManagement",
            new MenuMeta("router.equipmentTypeManagement", null, null),
            Lists.newArrayList(UserTypeEnum.TEACHER)),

    /**
     * 器材管理菜单项
     * - 父菜单：器材管理（menuId=200）
     * - 路由路径：/equipmentManagement
     * - 功能说明：管理器材基本信息及库存
     * - 权限范围：仅教师可见
     */
    EQUIPMENT_MANAGEMENT(
            "202",
            "200",
            "equipmentManagement",
            "views/Equipment/EquipmentManagement",
            null,
            "EquipmentManagement",
            new MenuMeta("router.equipmentManagement", null, null),
            Lists.newArrayList(UserTypeEnum.TEACHER)),

    /**
     * 器材管理菜单项
     * - 父菜单：器材管理（menuId=200）
     * - 路由路径：/equipmentManagement
     * - 功能说明：管理器材基本信息及库存
     * - 权限范围：仅教师可见
     */
    EQUIPMENT_LIST(
            "202",
            "200",
            "equipmentList",
            "views/Equipment/EquipmentList",
            null,
            "EquipmentList",
            new MenuMeta("router.equipmentList", null, null),
            Lists.newArrayList(UserTypeEnum.TEACHER, UserTypeEnum.STUDENT)),

    /**
     * 借阅管理主菜单
     * - 顶级菜单（parentId=0）
     * - 路由路径：/loan
     * - 基础布局组件：Layout
     * - 功能说明：器材借阅流程的核心入口
     * - 权限控制：师生均可访问（实际权限由子菜单控制）
     */
    BORROW(
            "300",
            "0",
            "/borrow",
            "#",
            "/borrow/borrowManagement", // 重定向到默认子菜单
            "Borrow",
            new MenuMeta("router.borrow", "vi-cib:telegram-plane", null),
            Lists.newArrayList(UserTypeEnum.TEACHER, UserTypeEnum.STUDENT)),

    /**
     * 出借申请子菜单
     * - 父菜单：借阅管理（menuId=300）
     * - menuId唯一值：301
     * - 路由路径：/loan/loanApply
     * - 功能说明：用户发起器材借阅申请
     * - 权限控制：学生可提交申请，教师可审批
     */
    BORROW_MANAGEMENT(
            "301", // 修正后的唯一ID
            "300", // 指向父菜单
            "borrowManagement",
            "views/Borrow/BorrowManagement",
            null,
            "BorrowManagement",
            new MenuMeta("router.borrowManagement", null, null),
            Lists.newArrayList(UserTypeEnum.TEACHER)),

    /**
     * 申请列表子菜单
     * - 父菜单：借阅管理（menuId=300）
     * - menuId唯一值：302
     * - 路由路径：/loan/loanApplyList
     * - 功能说明：展示借阅申请记录（学生查看自己的，教师查看全部）
     * - 权限说明：根据用户类型过滤显示内容
     */
    MY_BORROW(
            "302", // 修正后的唯一ID
            "300", // 指向父菜单
            "myBorrow",
            "views/Borrow/MyBorrow",
            null,
            "MyBorrow",
            new MenuMeta("router.myBorrow", null, null),
            Lists.newArrayList(UserTypeEnum.TEACHER, UserTypeEnum.STUDENT)),

    /**
     * 用户管理主菜单
     * - 独立顶级菜单（parentId=0）
     * - 路由路径：/user
     * - 基础布局组件：Layout
     * - 功能说明：系统用户账号管理入口
     * - 权限限制：仅教师可访问
     */
    USER(
            "400",
            "0",
            "/user",
            "#",
            "/user/userManagement",
            "User",
            new MenuMeta("router.user", "vi-eos-icons:role-binding", null),
            Lists.newArrayList(UserTypeEnum.TEACHER)),

    /**
     * 用户列表子菜单
     * - 父菜单：用户管理（menuId=400）
     * - 路由路径：/user/list
     * - 功能说明：展示系统内所有用户信息的列表视图
     * - 权限继承：遵循父菜单权限设置（仅教师）
     */
    USER_LIST(
            "401",
            "400",
            "userManagement",
            "views/User/UserManagement",
            null,
            "UserManagement",
            new MenuMeta("router.userManagement", "vi-eos-icons:role-binding", null),
            Lists.newArrayList(UserTypeEnum.TEACHER)),
    ;

    /**
     * 菜单项的唯一标识符。
     */
    private final String menuId;
    /**
     * 父菜单项的标识符。
     */
    private final String parentId;
    /**
     * 菜单项的路径。
     */
    private final String path;
    /**
     * 与菜单项关联的组件。
     */
    private final String component;
    /**
     * 菜单项的重定向路径。
     */
    private final String redirect;
    /**
     * 菜单项的名称。
     */
    private final String name;
    /**
     * 菜单项的元数据，包括图标、标题等。
     */
    private final MenuMeta meta;
    /**
     * 允许访问该菜单项的用户类型列表。
     */
    private final List<UserTypeEnum> userTypeEnums;

    /**
     * 构造函数，用于初始化菜单项的各个属性。
     *
     * @param menuId        菜单项的唯一标识符
     * @param parentId      父菜单项的标识符
     * @param path          菜单项的路径
     * @param component     与菜单项关联的组件
     * @param redirect      菜单项的重定向路径
     * @param name          菜单项的名称
     * @param meta          菜单项的元数据
     * @param userTypeEnums 允许访问该菜单项的用户类型列表
     */
    MenuEnum(
            String menuId,
            String parentId,
            String path,
            String component,
            String redirect,
            String name,
            MenuMeta meta,
            List<UserTypeEnum> userTypeEnums) {
        this.menuId = menuId;
        this.parentId = parentId;
        this.path = path;
        this.component = component;
        this.redirect = redirect;
        this.name = name;
        this.meta = meta;
        this.userTypeEnums = userTypeEnums;
    }

    /**
     * 检查指定的用户类型是否允许访问该菜单项。
     *
     * @param userTypeEnum 要检查的用户类型
     * @return 如果允许访问则返回 true，否则返回 false
     */
    public boolean isUserTypeEnum(UserTypeEnum userTypeEnum) {
        return userTypeEnums.contains(userTypeEnum);
    }

    /**
     * 根据用户类型获取允许访问的菜单项列表。
     *
     * @param userTypeEnum 用户类型
     * @return 允许访问的菜单项列表
     */
    public static List<MenuEnum> listByUserTypeEnum(UserTypeEnum userTypeEnum) {
        List<MenuEnum> list = Lists.newArrayList();
        for (MenuEnum value : MenuEnum.values()) {
            if (value.isUserTypeEnum(userTypeEnum)) {
                list.add(value);
            }
        }
        return list;
    }
}
